﻿//frmTruyenThong_Nhan.loadData(), rptBangNhanVe.sbtnIn()

using System;
using System.Data;
using System.Data.SqlClient;

namespace prjKQXS_DLL.Truyen_thong
{
    public class clsTruyenThong
    {
        //Cài đặt event OnError để bắt các lỗi chưa được xử lý
        public delegate void OnErrorHandler(Exception e);
        public event OnErrorHandler OnError;

        //Cài đặt event OnAction để thông báo các trạng thái kết quả
        public delegate void OnActionHandler(SqlException e);
        public event OnActionHandler OnAction;

        /// <summary>
        /// Thực hiện thêm mới mẩu tin và trả về id của mẩu tin vừa thêm mới
        /// </summary>
        /// <param name="dr"></param>
        /// <param name="Ngay"></param>
        /// <returns></returns>
        public object Insert(DataRow dr, DateTime Ngay)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection conn = new SqlConnection(BienTc.connString);
                    conn.Open();

                    SqlCommand cmd = new SqlCommand(@"proc_TruyenThong_Insert", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@HopDongID", dr["HopDongID"]);
                    cmd.Parameters.AddWithValue("@SLVeNhan", dr["SLVeNhan"]);
                    cmd.Parameters.AddWithValue("@Ngay", Ngay.Date);
                    return cmd.ExecuteScalar();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }

            return DBNull.Value;
        }

        public void Update(DataRow dr)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection conn = new SqlConnection(BienTc.connString);
                    conn.Open();
                    SqlCommand cmd = new SqlCommand("proc_TruyenThong_Update", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.Parameters.AddWithValue("@TruyenThongID", dr["ID"]);
                    cmd.Parameters.AddWithValue("@SLVeNhan", dr["SLVeNhan"]);
                    cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }

        /// <summary>
        /// Xóa vé truyền thống theo TruyenThongID truyền vào
        /// </summary>
        /// <param name="TruyenThongID">ID của vé truyền thống muốn xóa</param>
        /// <param name="canRestore">true: có thể phục hồi; false: không thể phục hồi</param>
        public void Delete(string TruyenThongID, bool canRestore)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection sqlconn = new SqlConnection(BienTc.connString);
                    sqlconn.Open();
                    SqlCommand cmd;

                    if (canRestore)
                    {
                        cmd = new SqlCommand("UPDATE tblVESO SET isPublic = 0 Where ID = '" + TruyenThongID + "' and isPublic=1", sqlconn);
                    }
                    else
                    {
                        cmd = new SqlCommand("DELETE tblVESO WHERE ID = '" + TruyenThongID + "' and isPublic = 0", sqlconn);
                    }

                    int i = cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }

        /// <summary>
        /// Xóa vé truyền thống theo cán bộ và ngày
        /// </summary>
        /// <param name="DMCanBoID">ID của cán bộ có vé truyền thống muốn xóa</param>
        /// <param name="Ngay">Ngày chứa vé truyền thống muốn xóa</param>
        /// <param name="canRestore">true: có thể phục hồi; false: không thể phục hồi</param>
        public void DeleteAll(int DMCanBoID, DateTime Ngay, bool canRestore)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection sqlconn = new SqlConnection(BienTc.connString);
                    sqlconn.Open();
                    SqlCommand cmd;
                    string sql = "";

                    if (canRestore)
                    {
                        sql = @"UPDATE tblVESO
                                SET isPublic = 0 
                                FROM HOPDONG HD INNER JOIN tblVESO VS ON HD.ID = VS.HopDongID
                                WHERE HD.DMCanBoID = " + DMCanBoID +
                                    " and VS.NgayMoThuong = '" + Ngay.ToString("yyyy-MM-dd") +
                                    "' and VS.isPublic = 1";
                    }
                    else
                    {
                        sql = @"DELETE tblVESO 
                                FROM HOPDONG HD INNER JOIN tblVESO VS ON HD.ID = VS.HopDongID
                                WHERE HD.DMCanBoID = " + DMCanBoID +
                                    " and VS.NgayMoThuong = '" + Ngay.ToString("yyyy-MM-dd") +
                                    "' and VS.isPublic = 0";
                    }

                    cmd = new SqlCommand(sql, sqlconn);
                    int i = cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }

        /// <summary>
        /// Khôi phục lại vé truyền thống đã xóa trước đó
        /// </summary>
        /// <param name="TruyenThongID">ID của vé truyền thống muốn khôi phục</param>
        public void Restore(int TruyenThongID)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection sqlconn = new SqlConnection(BienTc.connString);
                    sqlconn.Open();
                    SqlCommand cmd;

                    cmd = new SqlCommand("UPDATE tblVESO SET isPublic = 1 Where ID = '" + TruyenThongID + "' and isPublic=0", sqlconn);
                    int i = cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }

        /// <summary>
        /// Khôi phục lại toàn bộ vé truyền thống của ngày đã xóa trước đó theo cán bộ
        /// </summary>
        /// <param name="DMCanBoID">ID của cán bộ có vé truyền thống muốn khôi phục</param>
        /// <param name="Ngay">Ngày có vé truyền thống muốn khôi phục</param>
        public void RestoreAll(int DMCanBoID, DateTime Ngay)
        {
            if (clsLicense.checkLicense())
            {
                try
                {
                    SqlConnection sqlconn = new SqlConnection(BienTc.connString);
                    sqlconn.Open();
                    SqlCommand cmd;
                    string sql = @"UPDATE tblVESO 
                                SET isPublic = 1
                                FROM HOPDONG HD INNER JOIN tblVESO VS ON HD.ID = VS.HopDongID
                                WHERE HD.DMCanBoID = " + DMCanBoID +
                                    " and VS.NgayMoThuong = '" + Ngay.ToString("yyyy-MM-dd") +
                                    "' and VS.isPublic = 0";
                    cmd = new SqlCommand(sql, sqlconn);
                    int i = cmd.ExecuteNonQuery();
                }
                catch (SqlException e)
                {
                    OnAction(e);
                }
                catch (Exception e)
                {
                    OnError(e);
                }
            }
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="addMode"></param>
        /// <param name="NgayMoThuong"></param>
        /// <param name="maDV">Mã đơn vị. Truyền vào "TC" hoặc mã đơn vị tương ứng</param>
        /// <param name="DMCanBoID">Truyền vào -1 hoặc id của cán bộ tương ứng</param>
        /// <param name="isPublic"></param>
        /// <param name="formName"></param>
        /// <returns></returns>
        public DataTable loadData(bool addMode, DateTime NgayMoThuong, string maDV, int DMCanBoID, bool isPublic, string formName)
        {
            DataTable dt = new DataTable("rptTruyenThong");
            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();
                SqlDataAdapter da = new SqlDataAdapter("proc_TruyenThong_loadData", conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.AddWithValue("@AddMode", addMode ? 1 : 0);
                da.SelectCommand.Parameters.AddWithValue("@FormName", formName);
                da.SelectCommand.Parameters.AddWithValue("@NgayMoThuong", NgayMoThuong.Date);
                da.SelectCommand.Parameters.AddWithValue("@MaDV", maDV == "TC" ? "%" : maDV);
                da.SelectCommand.Parameters.AddWithValue("@DMCanBoID", DMCanBoID);
                da.SelectCommand.Parameters.AddWithValue("@isPublic", isPublic ? 1 : 0);
                da.Fill(dt);
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }
            return dt;
        }


        /// <summary>
        /// Dùng tại frmTruyenThong_Nhan.loadData()
        /// </summary>
        /// <param name="addMode"></param>
        /// <param name="NgayMoThuong"></param>
        /// <param name="maDV">Mã đơn vị. Truyền vào "TC" hoặc mã đơn vị tương ứng</param>
        /// <param name="DMCanBoID">Truyền vào -1 hoặc id của cán bộ tương ứng</param>
        /// <param name="isPublic"></param>
        /// <param name="formName"></param>
        /// <returns></returns>
        public DataTable loadData(DateTime NgayMoThuong, string maDV, int DMCanBoID, bool isPublic, string formName)
        {
            DataTable dt = new DataTable("rptTruyenThong");
            try
            {
                SqlConnection conn = new SqlConnection(BienTc.connString);
                conn.Open();
                SqlDataAdapter da = new SqlDataAdapter("proc_TruyenThong_loadData", conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.AddWithValue("@AddMode", 0);
                da.SelectCommand.Parameters.AddWithValue("@FormName", formName);
                da.SelectCommand.Parameters.AddWithValue("@NgayMoThuong", NgayMoThuong.Date);
                da.SelectCommand.Parameters.AddWithValue("@MaDV", maDV == "TC" ? "%" : maDV);
                da.SelectCommand.Parameters.AddWithValue("@DMCanBoID", DMCanBoID);
                da.SelectCommand.Parameters.AddWithValue("@isPublic", isPublic ? 1 : 0);
                da.Fill(dt);

                da = new SqlDataAdapter("proc_TruyenThong_loadData", conn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.AddWithValue("@AddMode", 1);
                da.SelectCommand.Parameters.AddWithValue("@FormName", formName);
                da.SelectCommand.Parameters.AddWithValue("@NgayMoThuong", NgayMoThuong.Date);
                da.SelectCommand.Parameters.AddWithValue("@MaDV", maDV == "TC" ? "%" : maDV);
                da.SelectCommand.Parameters.AddWithValue("@DMCanBoID", DMCanBoID);
                da.SelectCommand.Parameters.AddWithValue("@isPublic", isPublic ? 1 : 0);
                da.Fill(dt);

                DataView dv = dt.DefaultView;
                dv.Sort = "MaDL ASC";
                dt = dv.ToTable();
            }
            catch (SqlException e)
            {
                OnAction(e);
            }
            catch (Exception e)
            {
                OnError(e);
            }

            return dt;
        }

        public DataTable Loadvesohuy(DateTime Ngay, string maDV)
        {
            SqlConnection conn = new SqlConnection(BienTc.connString);
            DataTable dt = new DataTable();
            try
            {

                if (maDV == "TC")
                {
                    SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM  VESO where Convert(Datetime,Ngaymothuong,103) = Convert(Datetime,@Ngay,103) and Left(ltrim(Madl),1)<> @madonvi Order by Madl", conn);
                    da.SelectCommand.Parameters.AddWithValue("@Ngay", Ngay);
                    da.SelectCommand.Parameters.AddWithValue("@madonvi", maDV);
                    da.Fill(dt);
                }
                else
                {
                    SqlDataAdapter da = new SqlDataAdapter(@"SELECT * From VESO where  Left(ltrim(Madl),1)=@madonvi and Convert(Datetime,Ngaymothuong,103) = Convert(Datetime,@Ngay,103) Order by Madl", conn);
                    da.SelectCommand.Parameters.AddWithValue("@Ngay", Ngay);
                    da.SelectCommand.Parameters.AddWithValue("@madonvi", maDV);
                    da.Fill(dt);
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
            }
            return dt;
        }

        public DataTable Loadvesohuycb(DateTime Ngay, string maDV)
        {
            SqlConnection conn = new SqlConnection(BienTc.connString);
            DataTable dt = new DataTable();
            try
            {
                if (maDV != "TC")
                {
                    SqlDataAdapter da = new SqlDataAdapter(@"Select Left(VESO.Madl,2) as Macb, DMCANBO.Ten_DT, Sum(VESO.Slvenhan) as Slvenhan,Sum(VESO.Slvehuy) as Slvehuy from VESO INNER JOIN DMCANBO ON Left(VESO.Madl,2) = DMCANBO.Ma_DT Where Convert(Datetime,VESO.Ngaymothuong,103) = Convert(Datetime,@Ngay,103) and  Left(ltrim(VESO.Madl),1)=@madonvi and VESO.Giave is not null group by Left(VESO.Madl,2),DMCANBO.Ten_DT order by Macb", conn);
                    da.SelectCommand.Parameters.AddWithValue("@Ngay", Ngay);
                    da.SelectCommand.Parameters.AddWithValue("@madonvi", maDV);
                    da.Fill(dt);
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
            }
            return dt;
        }

        public bool Ktmadlnhapvehuy(string ma_daiLy, DateTime Ngay)
        {
            bool retVal = false;
            SqlConnection conn = new SqlConnection(BienTc.connString);
            try
            {
                SqlCommand cmd = new SqlCommand("Select count(*) from VESO where Madl = @MA_DT and Convert(Datetime,Ngaymothuong,103) = Convert(Datetime,@Ngay,103)", conn);
                cmd.Parameters.AddWithValue("@MA_DT", ma_daiLy);
                cmd.Parameters.AddWithValue("@Ngay", Ngay);
                conn.Open();
                if (cmd.ExecuteScalar().ToString() == "0")
                {
                    retVal = true;
                }
                else
                {
                    retVal = false;
                }
            }
            catch (Exception)
            {
                retVal = false;
            }
            finally
            {
            }
            return retVal;
        }

        public DataTable Laynhapvehuy(string ma_daiLy, DateTime Ngay)
        {
            SqlConnection conn = new SqlConnection(BienTc.connString);
            DataTable dt = new DataTable();
            try
            {
                SqlDataAdapter da = new SqlDataAdapter(@"SELECT * From VESO where  Left(ltrim(Madl),1)=@madl and Convert(Datetime,Ngaymothuong,103) = Convert(Datetime,@Ngay,103) Order by Madl", conn);
                da.SelectCommand.Parameters.AddWithValue("@Ngay", Ngay);
                da.SelectCommand.Parameters.AddWithValue("@madl", ma_daiLy);
                da.Fill(dt);
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                if (conn.State == ConnectionState.Open)
                {
                    conn.Close();
                }
            }
            return dt;
        }

        public object Layvehuy(string ma_daiLy, DateTime Ngay, string tenCot)
        {
            SqlConnection conn = null;
            try
            {
                conn = new SqlConnection(BienTc.connString);
                conn.Open();
                SqlCommand cmd = new SqlCommand("Select " + tenCot.Trim() + " from VESO where Madl = @Madl and Convert(Datetime,Ngaymothuong,103) = Convert(Datetime,@Ngay,103)", conn);
                cmd.Parameters.AddWithValue("@Madl", ma_daiLy);
                cmd.Parameters.AddWithValue("@Ngay", Ngay);
                return cmd.ExecuteScalar();
            }
            catch (Exception)
            {
                return 0;
            }
            finally
            {
                conn.Close();
            }
        }

        public bool Ktmacbnhapvehuy(string ma_cb, DateTime Ngay)
        {
            bool retVal = false;
            SqlConnection conn = new SqlConnection(BienTc.connString);
            try
            {
                SqlCommand cmd = new SqlCommand("Select count(*) from VESO where Macb = @MA_DT and Convert(Datetime,Ngaymothuong,103) = Convert(Datetime,@Ngay,103)", conn);
                cmd.Parameters.AddWithValue("@MA_DT", ma_cb);
                cmd.Parameters.AddWithValue("@Ngay", Ngay);
                conn.Open();
                if (cmd.ExecuteScalar().ToString() == "0")
                {
                    retVal = true;
                }
                else
                {
                    retVal = false;
                }
            }
            catch (Exception)
            {
                retVal = false;
            }
            finally
            {
            }
            return retVal;
        }
 
        public bool Ktmacb(string ma_cb)
        {
            bool retVal = false;
            SqlConnection conn = new SqlConnection(BienTc.connString);
            try
            {
                SqlCommand cmd = new SqlCommand("Select count(*) from DMCANBO where Macb = @MA_DT ", conn);
                cmd.Parameters.AddWithValue("@MA_DT", ma_cb);
                conn.Open();
                if (cmd.ExecuteScalar().ToString() == "0")
                {
                    retVal = true;
                }
                else
                {
                    retVal = false;
                }
            }
            catch (Exception)
            {
                retVal = false;
            }
            finally
            {
            }
            return retVal;
        }


        /// <summary>
        /// Vé nhận hoặc vé hủy chỉ được nhập tại một trong 3 nơi là Đại lý, Cán bộ hoặc Công ty.
        /// Hàm này kiểm tra xem vé nhận và vé hủy đã được nhập tại một nơi nào đó chưa.
        /// </summary>
        /// <param name="Cap">Cap = 'L' (Đại lý); Cap = 'B' (Cán bộ); Cap = 'T' (Công ty)</param>
        /// <param name="Ngay">Ngày tháng nhập</param>
        /// <param name="MaDV">Mã đơn vị</param>
        /// <returns></returns>
        public static bool DaNhapVesoRoi(char Cap, DateTime Ngay, string MaDV)
        {
            SqlConnection conn = new SqlConnection(BienTc.connString);
            conn.Open();

            SqlCommand cmd = new SqlCommand("proc_TruyenThong_DaNhapVesoRoi", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@Cap", Cap);
            cmd.Parameters.AddWithValue("@Ngay", Ngay.Date);
            cmd.Parameters.AddWithValue("@MaDV", MaDV);
            int i = (int)cmd.ExecuteScalar();

            return i > 0;
        }

    }
}
